package com.silence.gmall.product.assembler;

import com.silence.gmall.product.domain.entity.BaseAttrValue;
import com.silence.gmall.product.dto.BaseAttrValueDto;
import org.mapstruct.*;

import java.util.List;

/**
 * @Author silence
 * @Date 2025-08-18 23:11
 * @Email 792245022@qq.com
 * @Version 1.0
 * @Description 属性值工厂
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface BaseAttrValueFactory {

    /**
     * 将 BaseAttrValueDto 转换为 BaseAttrValue
     *
     * @param source 源对象
     * @return 目标对象
     */
    @Named("baseAttrValueDto2BaseAttrValue")
    BaseAttrValue baseAttrValueDto2BaseAttrValue(BaseAttrValueDto source);

    /**
     * 将 BaseAttrValueDto 转换为 BaseAttrValue
     *
     * @param source 源对象
     * @return 目标对象
     */
    @Named("baseAttrValueDto2BaseAttrValueWithContext")
    @Mapping(target = "attrId", expression = "java(attrId)")
    BaseAttrValue baseAttrValueDto2BaseAttrValueWithContext(BaseAttrValueDto source, @Context Long attrId);

    /**
     * 将 BaseAttrValue 转换为 BaseAttrValueDto
     *
     * @param source 源对象
     * @return 目标对象
     */
    @Mapping(target = "edit", ignore = true)
    BaseAttrValueDto baseAttrValue2BaseAttrValueDto(BaseAttrValue source);

    /**
     * 将 BaseAttrValueDtoList 转换为 BaseAttrValueList
     *
     * @param source 源对象
     * @return 目标对象
     */
    @Named("baseAttrValueDtoList2BaseAttrValueList")
    @IterableMapping(qualifiedByName = "baseAttrValueDto2BaseAttrValue")
    List<BaseAttrValue> baseAttrValueDtoList2BaseAttrValueList(List<BaseAttrValueDto> source);

    /**
     * 将 BaseAttrValueDtoList 转换为 BaseAttrValueList
     *
     * @param source 源对象
     * @return 目标对象
     */
    @Named("baseAttrValueDtoList2BaseAttrValueListWithContext")
    @IterableMapping(qualifiedByName = "baseAttrValueDto2BaseAttrValueWithContext")
    List<BaseAttrValue> baseAttrValueDtoList2BaseAttrValueListWithContext(List<BaseAttrValueDto> source, @Context Long attrId);

    /**
     * 将 BaseAttrValueList 转换为 BaseAttrValueDtoList
     *
     * @param source 源对象
     * @return 目标对象
     */
    List<BaseAttrValueDto> baseAttrValue2BaseAttrValueDto(List<BaseAttrValue> source);

}
